package com.satan.juc.demo19;

import java.util.concurrent.LinkedBlockingDeque;
/*
LinkedBlockingDeque 是一个由链表结构组成的可选有界阻塞双端队列，实现了 BlockingDeque 接口。
它支持在队列的两端插入和移除元素，这使得它非常适合于生产者-消费者模式，其中元素需要从队列的两端进行处理。
*/
public class LinkedBlockingDequeExample {
    private static final LinkedBlockingDeque<String> deque = new LinkedBlockingDeque<>();
    //在这个例子中，生产者线程在队列的尾部添加元素，而消费者线程从队列的头部取出元素。
    //如果队列为空，消费者线程会等待直到队列中有元素可取；如果队列已满，生产者线程会等待直到队列中有空间可用。
    //这种方式确保了在多线程环境下对队列的安全访问，同时避免了复杂的同步问题。
    public static void main(String[] args) {
        // 生产者线程
        Thread producer = new Thread(() -> {
            try {
                for (int i = 0; i < 100; i++) {
                    String item = "Item" + i;
                    deque.putLast(item); // 在队列尾部添加元素
                    System.out.println("生产者生产: " + item);
                    Thread.sleep(100); // 模拟生产时间
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 消费者线程
        Thread consumer = new Thread(() -> {
            try {
                while (true) {
                    String item = deque.takeFirst(); // 从队列头部取出元素
                    System.out.println("消费者消费: " + item);
                    Thread.sleep(1000); // 模拟消费时间
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        producer.start();
        consumer.start();
    }
}
